package com.itmk.web.sys_role.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itmk.utils.ResultUtils;
import com.itmk.utils.ResultVo;
import com.itmk.web.sys_role.entity.RoleParm;
import com.itmk.web.sys_role.entity.SelectItme;
import com.itmk.web.sys_role.entity.SysRole;
import com.itmk.web.sys_role.service.SysRoleService;
import com.itmk.web.sys_role_menu.RoleMenu.RoleMenuService;
import com.itmk.web.sys_role_menu.entity.SaveMenuParm;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;

 /**
 * @Author zhuqianying
 */
@RequestMapping("/api/role")
@RestController
public class SysRoleController {
    @Autowired
    private SysRoleService sysRoleService; // 系统角色服务
    @Autowired
    private RoleMenuService roleMenuService; // 角色菜单服务

    /**
     * 新增角色
     * @param sysRole 角色实体对象
     * @return 操作结果
     */
    @PreAuthorize("hasAuthority('sys:role:add')")
    @PostMapping
    public ResultVo add(@RequestBody SysRole sysRole){
        sysRole.setCreateTime(new Date()); // 设置创建时间
        if(sysRoleService.save(sysRole)){ // 调用服务层保存角色
            return ResultUtils.success("新增成功!");
        }
        return ResultUtils.error("新增失败!");
    }

    /**
     * 编辑角色
     * @param sysRole 角色实体对象
     * @return 操作结果
     */
    @PreAuthorize("hasAuthority('sys:role:edit')")
    @PutMapping
    public ResultVo edit(@RequestBody SysRole sysRole){
        sysRole.setUpdateTime(new Date()); // 设置更新时间
        if(sysRoleService.updateById(sysRole)){ // 调用服务层更新角色
            return ResultUtils.success("编辑成功!");
        }
        return ResultUtils.error("编辑失败!");
    }

    /**
     * 删除角色
     * @param roleId 角色ID
     * @return 操作结果
     */
    @PreAuthorize("hasAuthority('sys:role:delete')")
    @DeleteMapping("/{roleId}")
    public ResultVo delete(@PathVariable("roleId") Long roleId){
        if(sysRoleService.removeById(roleId)){ // 调用服务层删除角色
            return ResultUtils.success("删除成功!");
        }
        return ResultUtils.error("删除失败!");
    }

    /**
     * 获取角色列表
     * @param parm 查询参数
     * @return 分页查询结果
     */
    @GetMapping("/getList")
    public ResultVo getList(RoleParm parm){
        // 构造分页对象
        IPage<SysRole> page = new Page<>(parm.getCurrentPage(),parm.getPageSize());
        // 构造查询条件
        QueryWrapper<SysRole> query = new QueryWrapper<>();
        if(StringUtils.isNotEmpty(parm.getRoleName())){ // 如果角色名称不为空，则添加模糊查询条件
            query.lambda().like(SysRole::getRoleName,parm.getRoleName());
        }
        query.lambda().orderByDesc(SysRole::getCreateTime); // 按创建时间降序排序
        IPage<SysRole> list = sysRoleService.page(page, query); // 调用服务层分页查询角色
        return ResultUtils.success("查询成功",list);
    }

    /**
     * 获取角色下拉数据
     * @return 角色下拉数据
     */
    @GetMapping("/selectList")
    public ResultVo selectList(){
        List<SysRole> list = sysRoleService.list(); // 查询所有角色
        // 返回的值
        List<SelectItme> selectItmes = new ArrayList<>();
        Optional.ofNullable(list).orElse(new ArrayList<>()) // 防止空指针异常
                .forEach(item ->{
                    SelectItme vo = new SelectItme();
                    vo.setCheck(false); // 默认不勾选
                    vo.setLabel(item.getRoleName()); // 设置下拉框显示的文本
                    vo.setValue(item.getRoleId()); // 设置下拉框的值
                    selectItmes.add(vo);
                });
        return  ResultUtils.success("查询成功",selectItmes);
    }

    /**
     * 保存角色菜单
     * @param parm 角色菜单参数
     * @return 操作结果
     */
    @PreAuthorize("hasAuthority('sys:role:assign')")
    @PostMapping("/saveRoleMenu")
    public ResultVo saveRoleMenu(@RequestBody SaveMenuParm parm){
        roleMenuService.saveRoleMenu(parm); // 调用服务层保存角色菜单
        return  ResultUtils.success("分配成功");
    }
}